package com.gitee.chessboard.model.word;

import com.gitee.chessboard.jdbc.parser.annotations.Id;
import com.gitee.chessboard.manager.DictionaryManager;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.util.HashMap;
import java.util.Map;

/**
 * 词的抽象实现
 *
 * @author 敲代码的旺财
 * @date 2021/11/17 17:16
 */
public abstract class AbstractWord implements Word {
    /**
     * 字典管理器
     */
    private DictionaryManager dictionaryManager;

    /**
     * 字典名
     */
    private String wordName;
    /**
     * 字典编码
     */
    @Id
    private String wordCode;
    /**
     * 字典名
     */
    private String dictionaryCode;

    /**
     * 字典类型
     */
    private Map<String, String> wordAttr;

    /**
     * 字典类型
     */
    private String wordAttrJson;

    public AbstractWord() {
    }

    public AbstractWord(DictionaryManager dictionaryManager) {
        this.dictionaryManager = dictionaryManager;
        this.wordAttr = new HashMap<>();
    }

    /**
     * 获取词的名称
     *
     * @return 词的名称
     */
    @Override
    public String getWordName() {
        return wordName;
    }

    /**
     * 获取词的编码
     *
     * @return 词的编码
     */
    @Override
    public String getWordCode() {
        return wordCode;
    }

    /**
     * 获取词的属性
     *
     * @return 词的属性
     */
    @Override
    public Map<String, String> getWordAttr() {
        if (wordAttr == null || wordAttr.size() == 0) {
            if (wordAttrJson == null || wordAttrJson.length() == 0) {
                wordAttr = new HashMap<>();
            } else {
                wordAttr = new Gson().fromJson(wordAttrJson, new TypeToken<Map<String, String>>() {
                }.getType());
            }
        }
        return wordAttr;
    }

    /**
     * 获取字典的编码
     *
     * @return 词的编码
     */
    public String getDictionaryCode() {
        return dictionaryCode;
    }

    /**
     * 设置字典的编码
     *
     * @param dictionaryCode 字典的编码
     */
    public void setDictionaryCode(String dictionaryCode) {
        this.dictionaryCode = dictionaryCode;
    }

    /**
     * 设置词的名称
     *
     * @param wordName 词的名称
     */
    @Override
    public void setWordName(String wordName) {
        this.wordName = wordName;
    }

    /**
     * 设置词的编码
     *
     * @param wordCode 词的编码
     */
    @Override
    public void setWordCode(String wordCode) {
        this.wordCode = wordCode;
    }

    /**
     * 添加词的属性
     *
     * @param attrName  属性名称
     * @param attrValue 属性值
     */
    @Override
    public void add(String attrName, String attrValue) {
        if (this.wordAttr == null) {
            this.wordAttr = new HashMap<>();
        }
        this.wordAttr.put(attrName, attrValue);
    }

    /**
     * 删除词的属性
     *
     * @param attrName 属性名称
     */
    @Override
    public void del(String attrName) {
        if (this.wordAttr == null) {
            return;
        }
        this.wordAttr.remove(attrName);
    }

    /**
     * 保存当前词
     */
    @Override
    public void saveSelf() {
        this.dictionaryManager.save(this);
    }

    /**
     * 删除当前词
     */
    @Override
    public void delSelf() {
        this.dictionaryManager.del(this);
    }

    /**
     * 设置字典管理器
     *
     * @param dictionaryManager 字典管理器
     */
    @Override
    public void setDictionaryManager(DictionaryManager dictionaryManager) {
        this.dictionaryManager = dictionaryManager;
    }

    public String getWordAttrJson() {
        return new Gson().toJson(wordAttr);
    }

    public void setWordAttrJson(String wordAttrJson) {
        this.wordAttrJson = wordAttrJson;
    }

    @Override
    public String toString() {
        return wordName;
    }
}
